<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset='UTF-8'>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>One Piece</title>
  <style>
  
  </style>
</head>
<body>
  <p id="app" class="sss"></p>
  <script src="./index.js">
  
  </script>
  <script src="./ast.js">
  </script>
  <script>
    function fetch(){
      return new Promise((res,rej)=>{
        // 请求会在 1s 以后 失败
        setTimeout(()=>{
          rej('err')
        },1000)
      })
    }

    // load 函数接收一个 onError 回调函数
    function load(onError){
      // 请求接口，得到 Promise 实例
      const p = fetch()
      // 捕获错误
      return p.catch((err)=>{
        // 当错误发生时，返回一个新的 Promise 实例， 并调用 onError 回调， 同时将 retry 函数作为 onError 回调的参数
        return new Promise((res,rej)=>{
          // retry 函数， 用来执行重试的函数，执行该函数会重新调用 load 函数 并发起请求
          const retry = () => res(load(onError))
          const fail = () => rej(err)
          onError(retry,fail)
        })
      })
    }

    load((retry,fail)=>{console.log('从新执行',retry,fail); fail()}).then(res=>console.log('成功了',res))
  </script>
</body>
</html>